﻿using GDM.Hogar.Entidades;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Managers.Properties;
using GDM.Hogar.Repositorios.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;

namespace GDM.Hogar.Managers
{
    public class UsuarioManager : IUsuarioManager
    {
        private readonly IUsuarioRepositorio _usuarioRepositorio;

        public UsuarioManager(IUsuarioRepositorio usuarioRepositorio)
        {
            if (usuarioRepositorio == null)
            {
                throw new ArgumentNullException("usuarioRepositorio");
            }
            _usuarioRepositorio = usuarioRepositorio;
        }

        public void ActivarUsuario(int usuarioId, bool activo)
        {
            _usuarioRepositorio.ActivarUsuario(usuarioId, activo);
        }

        public void ActualizarUltimoAcceso(int usuarioId)
        {
            _usuarioRepositorio.ActualizarUltimoAcceso(usuarioId);
        }

        public void CambiarContraseña(int usuarioId, string contraseñaNueva)
        {
            string contraseñaEncriptada = Encriptador.EncriptarContraseña(contraseñaNueva);
            if (contraseñaEncriptada.Length > 128)
            {
                throw new InvalidOperationException(Resources.ContraseñaIncorrecta);
            }
            _usuarioRepositorio.CambiarContraseña(usuarioId, contraseñaEncriptada);
        }

        public Usuario CrearUsuario(string nombreUsuario, string contraseña, int roleId)
        {
            var contraseñaEncriptada = Encriptador.EncriptarContraseña(contraseña);
            if (contraseñaEncriptada.Length > 128)
            {
                throw new InvalidOperationException(Resources.ContraseñaNoEsValida);
            }
            return _usuarioRepositorio.CrearUsuario(nombreUsuario, contraseñaEncriptada, roleId);
        }

        public void ActualizarUsuario(string nombreUsuario, int roleId, int usuarioId)
        {
            _usuarioRepositorio.ActualizarUsuario(nombreUsuario, roleId, usuarioId);
        }

        public bool ExisteUsuario(string nombreUsuario)
        {
            var usuario = _usuarioRepositorio.ObtenerUsuario(nombreUsuario);
            return usuario != null && usuario.Activo;
        }

        public IList<string> ObtenerNombresUsuarios()
        {
            return _usuarioRepositorio.ObtenerUsuarios().Select(x => x.NombreUsuario).ToList();
        }

        public Usuario ObtenerUsuario(int usuarioId)
        {
            return _usuarioRepositorio.ObtenerUsuario(usuarioId);
        }

        public IList<ConsultaUsuario> ObtenerUsuarios()
        {
            return _usuarioRepositorio.ObtenerUsuarios();
        }

        public bool ValidarUsuario(string nombreUsuario, string contraseña)
        {
            var usuario = _usuarioRepositorio.ObtenerUsuario(nombreUsuario);
            if (usuario == null)
            {
                return false;
            }
            var validacionExitosa = (usuario.Contraseña != null && Encriptador.VerificarContraseñaEncriptada(usuario.Contraseña, contraseña));
            return validacionExitosa;
        }
    }
}